#include "Curso.h"

Curso::Curso(unsigned int codigo, std::string descripcion) {
	this->codigo = codigo;
	this->descripcion = descripcion;
	fin_curso = false;
}

bool Curso::buscarClase(unsigned int codClase) {
	if(clases.find(codClase) != clases.end()) {
		return true;
	}
	return false;
}

// Busca si el alumno esta inscripto al curso
bool Curso::buscarAlumno(std::string nombre_alumno) {
	std::list<std::string>::iterator it;
	for(it = alumnos_inscriptos.begin(); it != alumnos_inscriptos.end(); it++) {
		if((*it).compare(nombre_alumno.c_str()) == 0) {
			return true;
		}
	}
	return false;
}

Clase* Curso::getClase(const unsigned int codClase) {
	return (clases[codClase]);
}

void Curso::agregarSocketsInstructor(Socket *socket_av) {
	std::map<unsigned int, Clase*>::iterator it;
	for(it = clases.begin(); it != clases.end(); it++)
		it->second->setSocket_Instr(socket_av);
}

void Curso::agregarSocketsAlumnos(Socket *socket_av) {
	sockets_AV.push_back(socket_av);
}

int Curso::inscribirAlumno(std::string nombre_usuario, Socket* socket_alumno_av) {
	std::list<std::string>::iterator it;
	for(it = alumnos_inscriptos.begin(); it != alumnos_inscriptos.end(); it++) {
		if(it->compare(nombre_usuario) == 0) {
			std::cerr << "Ya esta inscripto al curso" << std::endl;
			return -1;
		}
	}
	this->agregarSocketsAlumnos(socket_alumno_av);
	alumnos_inscriptos.push_back(nombre_usuario);
	return 0;
}

void Curso::iniciarClase(const unsigned int codClase) {
	Clase *clase = this->getClase(codClase);
	std::list<Socket*>::iterator it_socket_av;
	for(it_socket_av = sockets_AV.begin(); it_socket_av != sockets_AV.end(); it_socket_av++)
		clase->agregarSocketAlumno_AV(*it_socket_av);
}

// Finaliza el curso si todas las clases estan terminadas
void Curso::finalizarCurso() {
	std::map<unsigned int, Clase*>::iterator it;
	unsigned int finalizadas = 0;
	for(it = clases.begin(); it != clases.end(); it++) {
		if((*it).second->esta_Terminada())
			finalizadas++;
	}
	if(finalizadas == clases.size())
		fin_curso = true;
}

unsigned int Curso::getCodigo() {
	return codigo;
}

std::string Curso::getDescripcion() {
	return descripcion;
}

void Curso::AgregarClase(unsigned int codClase, Clase *clase) {
	clases[codClase] = clase;
}

std::map<unsigned int, Clase*> Curso::getClases() {
	return clases;
}

Curso::~Curso() {
	std::map<unsigned int, Clase*>::iterator it;
	for(it = clases.begin(); it != clases.end(); it++) {
		if(it->second->esta_Terminada()) {
			delete (&it);
			clases.erase(it);
			it++;
		}
	}
}
